#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
// 先只考虑只有字母的情况
// A 65 Z 90 a 97 z 122
// std::string CaesarEncryption(const std::string& source, const int& key)
// {
//     std::string result;
//     for (const auto &item : source)
//     {
//         if((char)item > 64 && char(item) < 91)
//         {
//             // 大写
//             result.push_back('A' + ((char)item - 65 + key) % 26);
//         }
//         else if((char)item > 96 && char(item) < 123)
//         {
//             result.push_back('a' + ((char)item - 97 + key) % 26);

//         }
//     }
//     return result;
// }




// 进阶 去掉空格 设置表 但是还是只考虑字母
// 给定一个时间串 作为随机数种子 随机生成一个表格
std::string CaesarEncryption(const std::string& source, const int& key)
{
    srand((unsigned)key);
    // 如何打乱一个有序数组?
    std::vector<char> preTable;
    // 填充字符
    for (char pos = 'A'; pos < 'Z'; ++pos)
    {
        preTable.push_back(pos);
        preTable.push_back(pos + 32);
    }
    for (size_t i = 0; i < preTable.size(); ++i)
    {
        for (size_t j = i; j < preTable.size() - 1; ++j)
        {
            if (rand() % 2) std::swap(preTable[j], preTable[j + 1]);
        }
    }
    std::map<char, int> table;
    for (char i = 0; i < preTable.size(); ++i)
    {
        table[preTable[i]] = i;
    }
    std::string result;
    for (const auto& item : source)
    {
        if ((char)item != ' ')
        {
            if (((char)item > 64 && char(item) < 91) || ((char)item > 96 && char(item) < 123))
            {
                // std::cout << (table[(char)item] + key % preTable.size()) % preTable.size() << std::endl;
                result.push_back(preTable[(table[(char)item] + key % preTable.size()) % preTable.size()]);
            }
        }
    }
    return result;
}


std::string CaesarDecryption(const std::string& source, const int& key)
{

    srand((unsigned)key);
    // 如何打乱一个有序数组?
    std::vector<char> preTable;
    // 填充字符
    for (char pos = 'A'; pos < 'Z'; ++pos)
    {
        preTable.push_back(pos);
        preTable.push_back(pos + 32);
    }
    for (size_t i = 0; i < preTable.size(); ++i)
    {
        for (size_t j = i; j < preTable.size() - 1; ++j)
        {
            if (rand() % 2) std::swap(preTable[j], preTable[j + 1]);
        }
    }
    std::map<char, int> table;
    for (char i = 0; i < preTable.size(); ++i)
    {
        table[preTable[i]] = i;
    }

    std::string result;
    for (const auto& item : source)
    {
        if ((char)item != ' ')
        {
            if (((char)item > 64 && char(item) < 91) || ((char)item > 96 && char(item) < 123))
            {
                // std::cout << (table[(char)item] + preTable.size() - key % preTable.size()) % preTable.size() << std::endl;
                result.push_back(preTable[(table[(char)item] + preTable.size() - key % preTable.size()) % preTable.size()]);
            }
        }
    }
    return result;
}


int main()
{
    std::string tmp;
    int key = 0;
    std::cin >> tmp >> key;
    std::string result = CaesarEncryption(tmp, key);

    std::cout << result << std::endl;
    std::cout << CaesarDecryption(result, key) << std::endl;
    return 0;
}
